//******以下是全局参数区域****
showFlag=1
//剪贴板
cpb=""
//是否允许英文输入。默认0是英文开始输入。
englishflag=0

//显示源码
showCodeFlag=0

//格式刷动作
brushFlag=0

// 存储格式刷格式数据
format={}
// 判断格式刷次数

//这里设定上传文件大小（兆），同时也要在php init 中修改
var setSize=2048

//这里是记录触屏次数，解决复制弹出系统菜单问题
var  touchC=0
//记录触摸开始和结束时间
endTime=0
startTime=0

//******以上是全局参数区域****


window.onload=function()
{
 //设置顶部的工具自动居中
  setMinMax()
  // 撤销和反撤销：在加载函数中调用了一次，里面定义了一个input触发函数
  // 如果这里调用又定义了一个input函数，到时输入时触发两个函数
  undoAandRundo()
  //文字加粗
  bold()
  //斜体字
  italic()
  // 下划线
  underline()
  //删除线
  strikethrough()
  //添加日期
  calendar()
  //左对齐
  left()
  //居中
  center()
  //右对齐
  right()
  // 两端对齐
  justify()
  //复制
  copy()
  //剪贴
  cut()
  //张贴
  paste()
  //解决键盘复制不能添加到自己剪贴板问题
  cv()
  //字体大小选项
  selectFontSize()

 //增减字号
  addAndsub()
  // 文件上传
  showUpFile()
  //刷新编辑按钮和分类框的初始化布局
  setMinMax()
//选择标题
  showH()

//背景色
  Abackground()
 // 字体颜色
  AColor()
 //显示或关闭源码
   showOrCloseCode()
   
   //格式刷
   brush()
   //清除格式
   eraser()
   //表格
   allTableFunction()

   //保存
   saveData()
   //编辑加载
   loadText()
   //获取字体表
    setFont()
    //给表格添加点击
    addClick()
    // 移动
    move()
    //设定手机上传盒的距离顶部的高度
    // setUploadBoxTop()
    
    //阻止华为系统菜单弹出
    stopEject()
 // // 滚动到指定位置
     scroll()
    //获取点击开始时间
    getStartTime()
    // 解决表格张贴会带格式的问题
     // paseText()已经在加载函数中调用了一次所以不要调用
     

}



// function setUploadBoxTop()
// {
//  var showFile=document.getElementById("showFile")
//  showFile.style.top="500px"
// }







//设置顶部的工具自动居中
window.addEventListener('resize',setMinMax);
function  setMinMax()
{
 var box=document.getElementById("box")
 var minMax=document.getElementById("minMax")
 var children=document.getElementsByClassName("edit")
 var showStates=document.getElementById("showStates")
 var chld=children[0]

 var upf=document.getElementById("showFile")
    var state=document.getElementById("state")
    var iconBox=document.getElementById("iconBox")
    var minMax=document.getElementById("minMax")

    var windowWidth = document.documentElement.clientWidth || window.innerWidth;
    upf.style.left=(box.offsetWidth-upf.offsetWidth)/2
    showStates.style.left=(windowWidth-250)/2+"px"
     if(document.getElementsByClassName("fa").length*150<iconBox.offsetWidth)
     {
      minMax.style.height="100px"
      
     }
     else
     {
      // alert(Math.round(children.length/parseInt(iconBox.offsetWidth/150))*100+"px")
       minMax.style.height=Math.round(children.length/parseInt(iconBox.offsetWidth/150))*100+"px"
     }
    
 oldW=box.offsetWidth
 childL=minMax.children.length
 childW=chld.offsetWidth
 if(oldW>childL*childW)
 {
  minMax.style.width=childL*childW+"px"
  
 }
 else
 {
  newW=Math.floor(oldW/150)*150
  minMax.style.width=newW
  
 }

 state.style.paddingLeft=(box.offsetWidth-minMax.offsetWidth)/2+"px"
}

//撤销和反撤销
let historyStack=[];
let deleStack = [];
var inputCount=0
function  undoAandRundo()
{
    var hisL=20
  //这里记录每次输入的内容，以便以通过弹出最后一个元素给deleStack
  // 记录弹出的元素，获取第倒数二个元素来进行回退。
  historyStack.push(document.getElementById("text").innerHTML)
  if(historyStack.length>hisL)
  {
    historyStack.shift()
  }
  if(deleStack.length>hisL)
  {
    deleStack.shift()
  }
  // console.log(historyStack)
  // 这里记录historyStack弹出的最后一个元素，以便弹出自己最后一个给historyStack
  // 进行前进
  
  const editableDiv = document.getElementById('text');
  // *************解决中文输入或英文输入问题************
  // 1、同一个元素的监听是重写js类中的行数，行数的执行顺序在js类中默认已经
  // 写死了，所以，这里的重写不改变监听的顺序。
  // 这里先触发compositionstart，然后是 input 然后是compositionend
  // 这里必须有个标记，标记是中文输入开始了，还是英文输入开始了

  

  //compositionstart 中文开始输入就会触发一次，后面不会再触发。
  // 触发中文输入了说明后面的都是中文，直到出现compositionend
  // 表示中文输入结束。后面再输入才会再次触发compositionstart

  editableDiv.addEventListener('compositionstart', function(event) {
      // 这里表示已经触发了中文输入后面的都是中文输入，
      // 所以英文输入标志变为1，掐断后面的input监听（所有的输入类型）
     //解决按一次触发两次问题
      if(inputCount==0)
        {
            inputCount=1
            return
        }
        else
        {
            inputCount=0
        }
        if(showFlag==1)
        { 
           console.log("\n#####中文输入开始:");
        }
      englishflag=1;     
  });

  // compositionend这里表示中文输入完成了，然后获取文本框中文本放在数组中，
  // 中文输入完成后打开掐断英文输入的标致，说明英文可以输入了。用于是input先
  // 执行所以这时英文在掐断状态，所以input监听中不能获取数据，修改列表。
  // 所以在最后也是在compositionend中要执行获取数据和修改列表行为。
  editableDiv.addEventListener('compositionend', function(event) {
        //解决按一次触发两次问题
      if(inputCount==0)
        {
            inputCount=1
            return
        }
        else
        {
            inputCount=0
        }

      const text = editableDiv.innerHTML;
      historyStack.push(text);
      englishflag=0;
      if(historyStack.length>hisL)
      {
        historyStack.shift()
      }
      if(deleStack.length>hisL)
      {
        deleStack.shift()
      }

      if(showFlag==1)
      { 
        console.log("  记录栈:",historyStack);
        console.log("  删除栈:",deleStack);
        console.log("#####中文输入结束,恢复英文输入");
      }
  });

  // 这里是英文输入监听input，当进入中文输入时掐断判断为1，所以不能
  // 获取英文数据和修改列表，当中文输入完成，由于input先执行所以英文
  // 还是不能输入，等中文输入完成之后compositionend恢复英文输入，flage=0
  // 所以如果这是输入法切换到英文了就不会掐断，可以进行英文输入了。
  editableDiv.addEventListener('input', function(event) {
     //解决按一次触发两次问题
    if(inputCount==0)
    {
        inputCount=1
        return
    }
    else
    {
        inputCount=0
    }
   var text = editableDiv.innerHTML;
   if(showCodeFlag!=1)
   {
       var cn=editableDiv.childNodes
       var len=cn.length
       for(var i=0;i<len;i++)
       {   
        if(cn[i] instanceof Text)
        {
         var p=document.createElement("p")
         p.innerHTML=cn[i].nodeValue+"<br>"
         editableDiv.insertBefore(p,cn[i])
         editableDiv.removeChild(cn[i+1])
        }
        //由于规定编辑框中要为p的独立块，其中在记录函数中
        //有这项检查，所以必须包装为p
        else if(cn[i]!=undefined&&cn[i].tagName!="P")
        {
             var p=document.createElement("p")
             p.innerHTML=cn[i].innerHTML+" "
             editableDiv.insertBefore(p,cn[i])
             editableDiv.removeChild(cn[i+1])
        }
        else if(cn[i]!=undefined&&cn[i].innerText.replace(/\s+/ig,"").length==0&&cn[i].getElementsByTagName("table")==null&&cn[i].getElementsByTagName("img")==null)
        {
            cn[i].innerHTML="<br>"
        }

         if(i==(len-1)&&cn[i]!=undefined&&cn[i].innerHTML.replace(/\s+/ig,"")!="<br>")
        {
            var pbr=document.createElement("p")
            pbr.innerHTML="<br>"
            editableDiv.appendChild(pbr)
        }
       }
       if (len==0)
       {
            editableDiv.innerHTML="<p><br></p>"
       }
   }
      if(englishflag==0)
      {
         if(historyStack.length>hisL)
          {
            historyStack.shift()
          }
          if(deleStack.length>hisL)
          {
            deleStack.shift()
          }
          
          historyStack.push(text);
          if(showFlag==1)
          { 
            console.log("\n******英文输入:")
            console.log("  记录栈:",historyStack)
            console.log("  删除栈:",deleStack)
            console.log("******英文结束:")
          }
      }
  });

   // 这里是撤销操作
  function undo() {
      if (historyStack.length == 0) return;
      //记录栈弹出最后输入的数据到删除栈中，然后把记录栈倒数第二个
      // 放到文本中。
      if(historyStack.length>1)
      {
       deleStack.push(historyStack.pop());
       const text = historyStack[historyStack.length - 1];
       editableDiv.innerHTML = text || '';
      }
      else
      {
       const text = historyStack[historyStack.length - 1];
       editableDiv.innerHTML = text || '';
      }
      
      if(showFlag==1)
      { 
       console.log("撤销#")
        console.log("  记录栈:",historyStack)
        console.log("  删除栈:",deleStack)
     }
  }

   
  // 实现反撤销功能
  function reundo() {
      // 如果删除栈中有数据进行反撤销，没有就结束
      if (deleStack.length ===0) return;
      //删除栈通过弹出的形式给记录栈恢复数据。
      historyStack.push(deleStack.pop());
      // 然后把记录栈最后的数据给文本框中
      const text = deleStack[deleStack.length - 1];
      editableDiv.innerHTML= historyStack[historyStack.length-1];
      if(showFlag==1)
      { 
        console.log("反撤销#")
        console.log("记录栈:",historyStack)
        console.log("删除栈:",deleStack)
     }
  }

  document.getElementById("undo").ontouchend=function(){
   endTime=Date.now();
 if((endTime-startTime)>90){return }
   undo()}
  document.getElementById("reundo").ontouchend=function(){
   endTime=Date.now();
 if((endTime-startTime)>90)
 {return }
   reundo()}
  
}

function  bold()
{
 var bd=document.getElementById("bold")
 var unbd=document.getElementById("unBold")

 bd.ontouchend=function(event)
 {    
  endTime=Date.now();
 if((endTime-startTime)>90){return }
    event.preventDefault()
    if(showCodeFlag==1)
   {
      
      alert("目前为代码模式请先返回")
      return
   }
    
     $("#bold").selsectObj({"style":"font-weight:bolder"})
      undoAandRundo()
 }
 
 unbd.ontouchend=function(event)
 {
  endTime=Date.now();
 if((endTime-startTime)>90){return }
  event.preventDefault()
  if(showCodeFlag==1)
   {
      
      alert("目前为代码模式请先返回")
      return
   }
     $("#unBold").selsectObj({"style":"font-weight:normal"})
      undoAandRundo()
 }
}
//斜体字
function italic()
{
 var it=document.getElementById("italic")
 var unIt=document.getElementById("unItalic")
 it.ontouchend=function (event) {
  endTime=Date.now();
 if((endTime-startTime)>90){return }
  event.preventDefault()
 if(showCodeFlag==1)
   {
      
      alert("目前为代码模式请先返回")
      return
   }
  $("#italic").selsectObj({"style":"font-style:italic"})
   undoAandRundo()
 }
 
 
 unIt.ontouchend=function(event)
 {
  endTime=Date.now();
 if((endTime-startTime)>90){return }
  event.preventDefault()
  if(showCodeFlag==1)
   {
      
      alert("目前为代码模式请先返回")
      return
   }
  $("#unItalic").selsectObj({"style":"font-style:normal"})
  undoAandRundo()
 }
}
// 下划线
function underline()
{
 var ud=document.getElementById("underline")
 var unUd=document.getElementById("unUnderline")
 ud.ontouchend=function (event) 
 {
  endTime=Date.now();
  if((endTime-startTime)>90){return }
  event.preventDefault()
  if(showCodeFlag==1)
   {
      
      alert("目前为代码模式请先返回")
      return
   }
  
  $("#italic").selsectObj({"style":"text-decoration:underline+"})
  undoAandRundo()
 }
 
 unUd.ontouchend=function(event)
 {
  endTime=Date.now();
  if((endTime-startTime)>90){return }
  event.preventDefault()
  if(showCodeFlag==1)
   {
      
      alert("目前为代码模式请先返回")
      return
   }
  $("#unItalic").selsectObj({"style":"text-decoration:underline--"})
  undoAandRundo()
 }
}
// 删除线
function strikethrough()
{
  var st=document.getElementById("strikethrough")
 var unSt=document.getElementById("unStrikethrough")
 st.ontouchend=function (event) 
 {
  endTime=Date.now();
  if((endTime-startTime)>90){return }
  event.preventDefault()
  if(showCodeFlag==1)
   {
      
      alert("目前为代码模式请先返回")
      return
   }
  $("#italic").selsectObj({"style":"text-decoration:line-through+"})
  undoAandRundo()
 }
 
 
 unSt.ontouchend=function(event)
 {
  endTime=Date.now();
  if((endTime-startTime)>90){return }
  event.preventDefault()
  if(showCodeFlag==1)
   {
      
      alert("目前为代码模式请先返回")
      return
   }
  $("#unItalic").selsectObj({"style":"text-decoration:line-through--"})
  undoAandRundo()
 }
}

  //添加日期
 function calendar()
 {
    var ca=document.getElementById("calendar")
    ca.ontouchend=function(event)
    {
     endTime=Date.now();
  if((endTime-startTime)>90){return }
     event.preventDefault()
     if(showCodeFlag==1)
   {
      
      alert("目前为代码模式请先返回")
      return
   }
     const year = new Date().getFullYear();
   const month = new Date().getMonth() + 1; //getMonth()返回的是0-11，需要加1来表示实际的月份
   const day = new Date().getDate();
   const dd=new Date().getDay();
   const hours = new Date().getHours();
   const minutes = new Date().getMinutes();
   const seconds = new Date().getSeconds();
     getAtR(""+year+"年"+month+"月"+day+"日"+hours+"时"+minutes+"分"+seconds+"秒|星期"+(dd))
     undoAandRundo()
    }
}


//获取光标
function getLight()
{
    var selection=document.getSelection()
    var text=document.getElementById("text")

    if(selection.anchorNode!=null&&text.contains(selection.anchorNode))
    {
         text.removeEventListener("click",clickText)
        return selection.getRangeAt(0);
    }
    else
    {   
        text.addEventListener("click",clickText)
        return "no"
    }
}

//和上面的函数一起解决表格插入不能聚焦问题
function clickText(e)
{
    lightMouse=document.getSelection().getRangeAt(0)
}


 // 完结：获取i光标所在位置并插入内容
function   getAtR(content)
{  
    if(getBrowser()=='ie')
    {
      o=document.selection.createRange();
      o.pasteHTML(content);
    }
    else if(getBrowser()=='chrome')
    {

        var rng = document.getSelection().getRangeAt(0);
        var frg = rng.createContextualFragment(content);
        rng.insertNode(frg);
    }

    //获取浏览器版本
    function getBrowser()
    {
        var agentValue = window.navigator.userAgent.toLowerCase();
        if(agentValue.indexOf('msie')>0){
            return "ie";
        }else if(agentValue.indexOf('firefox')>0){
            return "ff";
        }else if(agentValue.indexOf('chrome')>0){
            return "chrome";
        }
    }
}


//左对齐
function left()
{  
 var lf=document.getElementById("left")
 lf.ontouchend=function(event){
  endTime=Date.now();
  if((endTime-startTime)>90){return }
  event.preventDefault()
   if(showCodeFlag==1)
   {
      
      alert("目前为代码模式请先返回")
      return
   }
   if(jdS())
   {
  return 
   }
   document.execCommand("JustifyLeft")
    // 因为执行上面的命令时已经触发input函数导致记录了一次所以下面的不需要
   // undoAandRundo()
 }
}
// 居中
function center()
{
 var ct=document.getElementById("center")
 ct.ontouchend=function(event){
  endTime=Date.now();
  if((endTime-startTime)>90){return }
  event.preventDefault()
  if(showCodeFlag==1)
   {
      
      alert("目前为代码模式请先返回")
      return
   }
   if(jdS())
   {
  return 
   }
   document.execCommand("JustifyCenter")
    // 因为执行上面的命令时已经触发input函数导致记录了一次所以下面的不需要
   // undoAandRundo()
  
 }
}
// 右对齐
function right()
{
 var rt=document.getElementById("right")
 rt.ontouchend=function(event){
  endTime=Date.now();
  if((endTime-startTime)>90){return }
  event.preventDefault()
  if(showCodeFlag==1)
   {
      
      alert("目前为代码模式请先返回")
      return
   }
   if(jdS())
   {
  return 
   }
  document.execCommand('justifyright')
   // 因为执行上面的命令时已经触发input函数导致记录了一次所以下面的不需要
   // undoAandRundo()
  
 }
}
// 两端对齐
function justify()
{
 var jf=document.getElementById("justify")
 jf.ontouchend=function(event){
  endTime=Date.now();
  if((endTime-startTime)>90){return }
  event.preventDefault()
  if(showCodeFlag==1)
   {
      
      alert("目前为代码模式请先返回")
      return
   }
   if(jdS())
   {
  return 
   }
  document.execCommand('justifyfull')
   // 因为执行上面的命令时已经触发input函数导致记录了一次所以下面的不需要
   // undoAandRundo()
 }
}


//复制
function  copy()
{
 var text=document.getElementById("text")
 var cp=document.getElementById("copy")
 cp.ontouchend=function(event)
 {   
  endTime=Date.now();
  if((endTime-startTime)>90){return }
  event.preventDefault()
   if(jdS())
   {
  return 
   }
  cpb=document.getSelection().toString()
  document.execCommand("copy")

   //复制不需要保存数据
   // undoAandRundo()
 }
}

//剪贴


function cut()
{
 var text=document.getElementById("text")
 var ct=document.getElementById("cut")
//  ct.ontouchend=function()
//  {
// cpb=document.getSelection().toString()
//   document.execCommand("cut")

//    undoAandRundo()
//    // alert(90)
//  }
 ct.ontouchend=function(event)
 {  
  endTime=Date.now();
  if((endTime-startTime)>90){return }
  event.preventDefault()
  if(jdS())
   {
  return 
   }
  //解决剪贴变动了导致文本输入变化，导致历史记录把它记录了
  cpb=document.getSelection().toString()
  document.execCommand("cut")
 }
}


//张贴
function paste()
{
 var text=document.getElementById("text")
 var pt=document.getElementById("paste")
 pt.ontouchend=function(event)
 {
  endTime=Date.now();
  if((endTime-startTime)>90){return }
  event.preventDefault()
  if(jdS("请选择位置"))
   {
  return 
   }
        getAtR(cpb)
        undoAandRundo()
 }
}

// 解决键盘复制后没有把内容放在自己的剪贴板中的问题。
function cv()
{
 document.addEventListener("keydown",function(e){
  if((e.ctrlKey && e.key=="c")||(e.key=="Meta" && e.key=="c")||(e.key="Control" && e.key=="c"))
  {
           cpb=document.getSelection().toString()
  }
  if((e.ctrlKey && e.key=="x")||(e.key=="Meta" && e.key=="x")||(e.key="Control" && e.key=="x"))
  {
           cpb=document.getSelection().toString()
  }
 })
}


//字体大小选项
getSelection=""
function selectFontSize()
{
 var box=document.getElementById("showFontSize")
 var tt=document.getElementById("tt")
 var fontSizeYes=document.getElementById("fontSizeYes")
 var fontSizeNumber=document.getElementById("fontSizeNumber")
    
 tt.ontouchend=function(event)
 {
  endTime=Date.now();
  if((endTime-startTime)>90){return }
  event.preventDefault()
  if(showCodeFlag==1)
   {
      
      alert("目前为代码模式请先返回")
      return
   }
 
  closeIndex("showFontSize")
  if(box.style.display=="none")
  {
   box.style.display="inline-block"
   box.style.left=0+"px";
   box.style.top=40+"px"
   tt.style.color="blue"

  }
  else
  {
   box.style.display="none"
   tt.style.color="black"
  }
  
 }
 

 fontSizeYes.ontouchend=function(event)
 {   
  
  event.preventDefault()
  if(jdS("请框选文字"))
   {
        return 
   }
      $().selsectObj({"style":"font-size:"+fontSizeNumber.innerText})
      box.style.display="none"
       undoAandRundo()
 }
 
 
 var leng=10
 for(var i=0;i<leng;i++)
 {
  var el=document.createElement("span")
  el.innerHTML=10+(i+1)*2+"px"
  el.style.display="inline-block"
  el.style.width="150px"
  el.style.height="100px"
  el.style.borderBottom="1px solid #ccc"
  el.style.fontSize="36px"
  el.style.lineHeight=el.style.height
  el.ontouchend=function(){
   if(jdS())
     {
        return 
     }
      $().selsectObj({"style":"font-size:"+this.innerText})
      box.style.display="none"
      undoAandRundo()
  }
  box.appendChild(el)
 }
}
//增减字号
function  addAndsub()
{
 var subNumber=document.getElementById("subNumber")
 var addNumber=document.getElementById("addNumber")
 var fontSizeNumber=document.getElementById("fontSizeNumber")
 addNumber.ontouchend=function(event)
 {
  event.preventDefault()
  var nb=parseInt(fontSizeNumber.innerText.replace("px",""))
  if(nb<100)
  {
   nb+=1
   fontSizeNumber.innerText=nb+"px"
  }
 }
 
 subNumber.ontouchend=function(event)
 {   
  event.preventDefault()
  if(jdS())
  {
   return 
  }
  var nb=parseInt(fontSizeNumber.innerText.replace("px",""))
  if(nb>1)
  {
   nb-=1
   fontSizeNumber.innerText=nb+"px"
  }
 }
}


//显示状态：
function state(t)
{
   var st=document.getElementById("stateWorder")
   var showStates=document.getElementById("showStates")
   st.innerHTML="状态:"+t
   if(t.replace("状态:","").replace(/\s+/ig,"").length!=0)
   {
      showStates.innerText="状态:"+t
      showStates.style.display="block"
      setTimeout(function()
      {
         showStates.style.display="none"
      },1500)
   
   }
   
}



//上传
function showUpFile()
{   
 //文件在哪处理
 var uploadUrl="dealCenter.php"
 // 指定文件存储路径
 var fileURL="/static/media/"
 var upFile=document.getElementById("file")
 var showFile=document.getElementById("showFile")
 var box=document.getElementById("box")
 var fileName=""
 var url =""
 var el=document.getElementById("preview")
    var oDataFlag=document.getElementById("oDataFlag")
 var uploadY=document.getElementById("uploadY")
 var uploadC=document.getElementById("uploadC")
    var upload=document.getElementById("upload")

    var selectFile=document.getElementById("selectFile")
    selectFile.onclick=function()
    {
     upFile.click();
    }
    


   //显示框框
    upload.ontouchend=function()
 {  
    
  endTime=Date.now();
  // if((endTime-startTime)>90){return }
  if(showCodeFlag==1)
   {
      alert("目前为代码模式请先返回")
      return
   }

   if(showFile.style.display=="none")
   {
    
     // upFile.value=""
        // preview.innerHTML="<div class='SmediaBox'></div>"
  showFile.style.display="block"
  closeIndex("showFile")
  showFile.style.left=(box.offsetWidth-showFile.offsetWidth)/2+"px"
  showFile.style.top="600px"
   // upFile.click();
   }
   else
   {
    // upFile.value=""
    //  preview.innerHTML="<div class='SmediaBox'></div>"
  showFile.style.display="none"
  closeIndex("showFile")
  showFile.style.left=(box.offsetWidth-showFile.offsetWidth)/2+"px"
   }
      
 
 }
 //取消
 uploadC.ontouchend=function()
 {
  fileName=""
  url=""
  showFile.style.display="none"
  el.innerHTML="<div class='SmediaBox'></div>"
  upFile.value=""
  state("上传已经取消")
  setTimeout(function(){state("")},1000)
 }
   // 确定
 uploadY.ontouchend=function()
 {   
  var text= document.getElementById('text')
     // var  title=document.getElementById("text")
     var  cls=document.getElementById("cls")
     var tL=text.innerText.replace(" ","").split("\n")
     var cL=cls.value.replace(" ","").replace("\n","")
     var getTitle=""
     var seletion = document.getSelection()
     var rang =""
     var subEd=document.getElementById("subEd")
     var newRang=document.createRange()
     var preview=document.getElementById("preview")
        

       //防止没有先选位置的插入
       text.focus()
        if(seletion.anchorNode==null||seletion.getRangeAt(0).commonAncestorContainer.id=='state')
        {
         alert("没有选择插入位置，即将在编辑区后插入")
         dealFocus(text,"text")
        }
         else
        {
         dealFocus(text,"select")
         // rang =seletion.getRangeAt(0);
         //  if(rang.commonAncestorContainer.id!="state")
         //  {
         //   getAtR("<br>")
         //  }
        }


        //防止后面添加的类，导致类获取焦点
     cls.blur()
     for(var x in tL)
     {
      
      if(tL[x].length!=0)
      {
       getTitle=tL[x]
       break
      }
      else
      {
       getTitle=""
      }
     }
        

        
     if(getTitle.length==0||cL.length==0)
     {
         alert("请先输入标题或分类")
         return
     }
        if(!isChineseEnglishDigit(getTitle))
        {
         alert("标题必须为中文英文数字()[]-组成")
         return
        }
         if(!isChineseEnglishDigit(cL))
        {
         alert("类别必须为中文英文数字()[]-组成")
         return
        }
         
     if(!(upFile.files[0] instanceof File))
     {
      alert("请先点击文件按钮选择文件后再点击上传")
      return
     }
     
     
      if(fileName.length==0)
     {
      fileName=upFile.files[0].name.replace(" ","")
     }
     
     
 
     state("准备上传......")
     var da=new Date()
     var y=da.getFullYear()
     var m=da.getMonth()+1
     var data=da.getDate()
     var h=da.getHours()
     var M=da.getMinutes()
     var s=da.getSeconds()
  
     fileName=getDate()+"-"+cL+"-"+getTitle+"-"+fileName
     var formData= new FormData();
     formData.append("file", upFile.files[0]);
     formData.append("cls",cL)
     formData.append("fc","uploadImg")
     formData.append("fileName",fileName)
     formData.append("dataFlag",cL+"#-#"+getTitle)
     formData.append("subEd",subEd.value)
      formData.append("oDataFlag",oDataFlag.value)
     getFileSize=upFile.files[0].size/1048576
       
     if(getFileSize>setSize)
     {
         alert("js:文件超过设定大小，请在服务器修改")
         return ;
     }
     setTimeout(function(){ ajax(formData,uploadUrl,"0",dealResponse)},1000)
     

  //处理分类抢焦点问题
  function dealFocus(text,fl="select")
  {  
   var delEl=document.getElementById("#flag#")
   var ele=document.createElement("span")
    ele.id="#flag#"
   if(delEl!=null&&delEl!=undefined)
   {
        delEl.parentNode.removeChild(delEl)
   }
   if(fl=="select")
   {
    var rang=document.getSelection().getRangeAt(0)
    rang.insertNode(ele)
   }
   else
   {
    text.appendChild(ele)
   }
  }



     //服务器返回处理
     function dealResponse(e)
     {     
           var saveData=document.getElementById("saveData")
           var event = new Event('touchend');
           //加载媒体
           function loadMedia(f=1)
           {   
               if(f==0)
               {
                   setTimeout(function()
                   {
                     state("加载完成")
                   },1000)
               }
               else
               {
                  state("加载完成")
               }
              
               upFile.value=""
               fileName=""
               file=""
               preview.innerHTML="<div class='SmediaBox'></div>"
               setTimeout(function()
               {
                 state("准备保存")
                 setTimeout(function()
                 {
                   saveData.dispatchEvent(event)

                 },1000)
                 
               },1000)
              
           }
            console.log("图片上传服务器反馈:"+e)
         
         //由于php服务器设定了一定的上传文件大小，超过的大小返回空，所以这里要提醒
         dealFocus(text,"selection")

         if(e.length==0)
         {
             alert("php:文件超过设定大小，请在服务器修改")
             return ;
         }

         if(e=="changeNameOrClass")
         {
             alert("名称和类型都重复,请修改")
             document.getElementById("subEd").value="no"
             return
         }


         oDataFlag.value=cL+"#-#"+getTitle
         //通过直接从js获得名称方式解决：视频文件太大返回的名称不知道为啥为空
         srcd=fileURL+fileName
         if(srcd.indexOf(".mp4")!=-1)
         {
             var media=document.createElement("video")
                 media.setAttribute("src",srcd)
                 media.setAttribute("controls","controls")
                 media.setAttribute("ontouchend","clf(this)")
         }
         else if(srcd.indexOf(".jpg")!=-1||srcd.indexOf(".jpeg")!=-1||srcd.indexOf(".png")!=-1||srcd.indexOf(".gif")!=-1)
         {
              var media=document.createElement("img")
                 media.setAttribute("src",srcd)
         }
         else if(srcd.indexOf(".mp3")!=-1)
         {
             var media=document.createElement("audio")
                 media.setAttribute("src",srcd)
                 media.setAttribute("controls","controls")

         }
         else
         {
              var media=document.createElement("a")
                 media.innerHTML=fileName
                 media.setAttribute("href",srcd)
                 media.setAttribute("target","view_window")
         }
         
         var br=document.createElement("br")
         var p=document.createElement("p")
         var p2=document.createElement("p")
         media.setAttribute("class","#-media")
         media.setAttribute("width","60%;")
         media.style.display="block"
         media.style.margin="0 auto"
         media.style.border="1px solid #ccc"
         media.style.padding="10px"

           var flag=document.getElementById("#flag#")
           var parent=flag.parentElement
           var oldbr=parent.getElementsByTagName("br")
          
           parent.appendChild(media)
           p.appendChild(br)
           parent.parentElement.insertBefore(p,parent.nextSibling)
          
           // showFile.style.display="none"

           for(var pj=0;pj<oldbr.length;pj++)
           {
              parent.removeChild(oldbr[pj])
           }

            parent.removeChild(flag)

          if(media.tagName=="A")
           {
                loadMedia(0)
           }
           else
           {
              media.onload=loadMedia
           }
      return
     }
 }


 

 
 upFile.onchange=function()
 {   
  url =window.URL.createObjectURL(upFile.files[0])
  fileName=upFile.files[0].name.replace(" ","")
  if (fileName.indexOf(".mp4")!=-1)
  {
      el.innerHTML="<video class='Smedia' controls='controls' style='width:100%;height:100%'  src='"+url+"'/>"
  }
  else if (fileName.indexOf(".jpg")!=-1||fileName.indexOf(".jpeg")!=-1||fileName.indexOf(".png")!=-1||fileName.indexOf(".gif")!=-1)
  {
      
      el.innerHTML="<img class='Smedia' src='"+url+"'/ style='width:100%;height:100%;'>"
  }
  else if (fileName.indexOf(".mp3")!=-1)
  {
      el.innerHTML="<audio class='Smedia' controls='controls' src='"+url+"'  style='width:100%;height:100%'/></audio>"
  }
  else
  {
      el.innerHTML="<a class='Smedia' href='"+url+"''>"+fileName.replace("C:\\fakepath\\","")+"</a>"
  }
 }
}


// ajax
function ajax(data,ulr,type,func)
{
    var httpRequest=new XMLHttpRequest()
    httpRequest.open("POST",ulr,true)
    if(type=="text")
    {
        
    }
    if(type=="json")
    {
        var head="application/json"
        httpRequest.setRequestHeader("Content-Type", head); 
    }
    
    httpRequest.onreadystatechange = function () 
    {
        if (httpRequest.readyState == 4 && httpRequest.status == 200)
        {
            flag=httpRequest.responseText.replace(/\s*/ig,"")
            return func(flag)
        }
    }
    
    if(type=="json")
    {
        httpRequest.send(JSON.stringify(data))
    }
    else
    {
        function progressFunction(e)
        {
            if(e.lengthComputable)
            {
                percent=Math.round(e.loaded/e.total*100).toString() 
                var cancelFile=document.getElementById("file")
                if(cancelFile.value.length==0)
                {
                 state("上传已经取消")
                 setTimeout(function(){state("")},1000)
                 return
                } 
                state("已经上传"+percent+"%")
                if(percent=="100")
                {
                   state("正在加载......")
                   document.getElementById("showFile").style.display="none"
                }
            }
        }
        httpRequest.upload.onprogress=progressFunction
        httpRequest.send(data)
    }
    
}


//选中标题
function showH()
{
 var sh=document.getElementById("HIco")
 var H=document.getElementById("H")

 sh.ontouchend=function(event)
 {   
  endTime=Date.now();
  if((endTime-startTime)>90){return }
  event.preventDefault()
  if(showCodeFlag==1)
   {
      
      alert("目前为代码模式请先返回")
      return
   }
   
      closeIndex("H") 
  if( H.style.display=="none")
  {
   H.style.display="block"
   H.style.left=0+"px";
   H.style.top=40+"px"
   sh.style.color="blue"
    var text=""
    text="<div id='titleS'>标题</div>"
    for(var i=0;i<3;i++)
    {
     text+="<button  id='h"+(i+1)+"'   ontouchend=song("+i+")>H"+(i+1)+"</buton>"
    }
    H.innerHTML=text
  }
  else
  {
   H.style.display="none"
   sh.style.color="black"
  }
 }
}

 function song(s)
 {  
  var text=document.getElementById("text")
  if(jdS("请框选文字"))
  {
   return 
  }
  var css={"textAlign":"center","fontSize":(32-s*8)+"pt","fontWeight":"bold"}
  var select=document.getSelection()
  var rang=select.getRangeAt(0)
  var getP=rang.startContainer.parentNode
  while(true)
  {
   if(getP.tagName=="P"||getP.contains(text))
   {
    break
   }
   else
   {
    getP=getP.parentNode
   }
  }
  
  // $().selsectObj({"style":"text-align: center;display:block;font-size:"+(32-s*8)+"px;font-weight:bold"})
  getP.style.textAlign="center"
  getP.style.display="block"
  getP.style.fontSize=(32-s*8)+"pt"
  getP.style.fontWeight="bold"
  showHChild(getP,css)
  text.innerHTML+="<p><br></p>"
  var sh=document.getElementById("H")
  setTimeout(function(){
   sh.style.display="none"
  },1000)
     undoAandRundo()
 }

//修改标题的子元素的样式
function showHChild(getP,css)
{  
 var chd=getP.children
 var len=chd.length
   if(len!=0)
   {
     for(var i=0;i<len;i++)
     {
      for(key in css)
      {
       chd[i].style[key]=css[key]
      }
   showHChild(chd[i],css)
     }
   }
   else
   {
     return
   }
}
//背景色
function  Abackground()
{  
 var aB=document.getElementById("ABackgrounIcon")
 var aBC=document.getElementById("bColor")
 aB.ontouchend=function(event)
 {  
  endTime=Date.now();
  if((endTime-startTime)>90){return }
  event.preventDefault()
  if(showCodeFlag==1)
   {
      
      alert("目前为代码模式请先返回")
      return
   }
   
  closeIndex("bColor")
  
  if(aBC.style.display=="none")
  {
   if(jdS("请框选文字"))
     {
     return 
     }
   aBC.style.display="inline-block"
   aBC.style.left=0+"px";
   aBC.style.top=40+"px"
   
  }
  else
  {  
   aBC.style.display="none"
   $().selsectObj({"style":"background:"+aBC.value})
   
    undoAandRundo()
  }
 }
}

//文字颜色
function  AColor()
{  
 var aC=document.getElementById("AColorIcon")
 var fC=document.getElementById("fColor")
 aC.ontouchend=function(event)
 {  
  endTime=Date.now();
  if((endTime-startTime)>90){return }
  event.preventDefault()
  if(showCodeFlag==1)
   {
      
      alert("目前为代码模式请先返回")
      return
   }
   
  closeIndex("fColor")
  if(fC.style.display=="none")
  {  
   if(jdS("请框选文字"))
   {
    return 
   }
   fC.style.display="inline-block"
   fC.style.left=0+"px";
   fC.style.top=40+"px"
  
  }
  else
  {
   fC.style.display="none"
   $().selsectObj({"style":"color:"+fC.value})
    undoAandRundo()
  }
 }
}
// 显示或则关闭源码
function showOrCloseCode()
{
 var text=document.getElementById("text")
 var showCode=document.getElementById("showCode")
 var stateWorder=document.getElementById("stateWorder")
 showCode.ontouchend=function(event)
 { 
  
  if(stateWorder.innerText.includes("正在加载")||stateWorder.innerText.includes("准备上传"))
  {
   
   alert("正在加载，不能点击源码按钮")
   return  
  }
  
  endTime=Date.now();
  if((endTime-startTime)>90){return }
  event.preventDefault()
  if(showCodeFlag==0)
  {
   text.innerText=text.innerHTML
   text.style.color="blue"
   showCode.style.color="red"
   closeIndex("showCode")
   showCodeFlag=1
   closeIndex("showCode")
  }
  else
  {
   text.innerHTML=text.innerText
   text.style.color="black"
   showCode.style.color="black"
   showCodeFlag=0
  }
 }
 paseText()
 tdclick()
}

// 格式刷动作函数
function brushAction()
{    
    var getSelection=document.getSelection()
 var te=document.getElementById("text")
 var actionAtri=""

 getRange=getSelection.getRangeAt(0)
 parentNode=getRange.startContainer.parentNode
 if((getRange.startContainer instanceof Text) && parentNode!=te)
 {
  actionAtri=parentNode.attributes
  format={}
  for(var j=0;j<actionAtri.length;j++)
  {
   format[actionAtri[j].name]=actionAtri[j].value
  }
 }
 // document.removeEventListener("touchend", brushAction)
 // document.addEventListener("touchend", pastFormat)
 
}


//张贴格式
function pastFormat()
{
 var getSelection=document.getSelection()
    var rangeCount=getSelection.rangeCount
    var getRange=""
    var clone=""
    var atri=""
    var parentNode=""
    var te=document.getElementById("text")
 
 for(var i=0;i<rangeCount;i++)
     {   
      var temp=document.createElement("span")
      getRange=getSelection.getRangeAt(i)
      clone=getRange.cloneContents()
      temp.appendChild(clone)
      console.log(temp.innerHTML,getRange.commonAncestorContainer)
      
      if((getRange.commonAncestorContainer.innerHTML)==temp.innerHTML&&getRange.commonAncestorContainer!=te)
      {
       temp=getRange.commonAncestorContainer
      }
     
      child=temp.getElementsByTagName("*")
      for(var key in format)
      {
         temp[key]=format[key]
      }
      if(format.length!=0)
      {
       for(var j=0;j<child.length;j++)
       {
           atri=child[j].attributes
           for(var k=0;k<atri.length;k++)
           {
         child[j].removeAtttribute(atri[k].name)   
           }
           for(var key in format)
           {
            child[j][key]=format[key]
           }
       } 
      }

      if(getRange.commonAncestorContainer.innerHTML!=temp.innerHTML||getRange.commonAncestorContainer==te)
         {
          getRange.deleteContents()
       getRange.insertNode(temp)
         }       
  undoAandRundo()
 }
}
// 格式刷*******手机版和网页版不一样
function brush()
{
 var bru=document.getElementById("brush")
 bru.ontouchend=function(event)
 {
  endTime=Date.now();
  if((endTime-startTime)>90){return }
  // 这里不需要组织默认行为
  if(showCodeFlag==1)
    {
      alert("目前为代码模式请先返回")
      return
    }
  if(brushFlag==0)
  {
   brushAction()
   brushFlag=1

  }
  else
  {
   pastFormat()
   brushFlag=0
  }
  // event.preventDefault()
  
  // var body = document.getElementsByTagName('body')[0];
  //document.getSelection().collapse(body,0);
  // document.addEventListener("ontouchend", brushAction)
  
 }
}

//清除格式
function   eraser()
{
 var  eraser=document.getElementById("eraser")
 eraser.ontouchend=function(event)
 {
  endTime=Date.now();
  if((endTime-startTime)>90){return }
  event.preventDefault()
  $().selsectObj({"style":"background:none;font-size:18px;font-weight:normal;color:black;text-align:left;text-decoration:none;font-style:none"})
 }
}

/*以下是表格插入*/


function getDate()
{
   var date=new Date()
   var y=date.getFullYear()
   var M=date.getMonth()+1
   var d=date.getDate()
   var h=date.getHours()
   var m=date.getMinutes()
   var s=date.getSeconds()
   var li=[y,M,d,h,m,s]
   var str=""
   for(var i=0;i<li.length;i++)
   {
     if(li[i]<10)
     {
       str+="0"+li[i]
     }
     else
     {
      str+=li[i]
     }
   }
   return str
}

// 插入表格
// 下面参数是记录鼠标位置
var  lightMouse=""
function allTableFunction()
{
 var tableB=document.getElementById("tableB")
 var  showBox=document.getElementById("tableSetBox")
 tableB.ontouchend=function(event)
 {   
  endTime=Date.now();
  if((endTime-startTime)>90){return }
  event.preventDefault()
  if(showCodeFlag==1)
   {
      
      alert("目前为代码模式请先返回")
      return
   }

   
  closeIndex("tableSetBox")
       if(showBox.style.display=="none")
       {
         showBox.style.display="inline-block"
         tableB.style.color="blue"
         lightMouse=getLight()
       }
       else
      {
           showBox.style.display="none"
           tableB.style.color="black"
      }
 }
 

 
 enterTable("text")
 addC()
 addR()
 deleC()
 deleR()

 setAddR()
 setdelR()
 setAddC()
 setdelC()

 addCW()
 delCW()
 addRW()
 delRW()

}

//显示表格高宽
function  showHW()
{
 var data=getdata()
    var showTable=document.getElementById("showTable")
    var shoW=document.getElementById("shoW")
 if(Object.keys(data)[0]!=undefined&&Object.keys(data)[0].includes("tr"))
  {
   
   var r=document.getElementById(Object.keys(data)[0]).parentNode.getElementsByTagName("tr").length
   var c=document.getElementById(Object.keys(data)[0]).getElementsByTagName("td").length
   var td=document.getElementById(Object.keys(data)[0]).getElementsByClassName(data[Object.keys(data)[0]])[0]
   if( data[Object.keys(data)[0]].length!=0&&data[Object.keys(data)[0]].includes("td"))
   {
    showTable.innerText=r+"x"+c
    var tdw=parseInt(td.style.width.replace("%","").replace("px",""))
    var tdh=parseInt(td.style.height.replace("%","").replace("px",""))
    shoW.innerText=tdw+"px"+tdh+"p"
   }   
   else
   {
    showTable.innerText="行数x列数"
    shoW.innerText="行宽x列宽"
   }
  }
 }
 
function enterTable(box) 
{
    var text=document.getElementById(box)
    var tB=document.getElementById("insertTableYes")
    var tableSetBox=document.getElementById("tableSetBox")
    var tableB=document.getElementById("tableB")
    insertTableYes.ontouchend=function(event)
    {   
     event.preventDefault()
     var trtd=[parseInt(document.getElementById("setR").value),parseInt(document.getElementById("setC").value)]
     var table = document.createElement('table');
     var tbody = document.createElement('tbody');
     var p=document.createElement('p');
     var date=getDate()
     table.id="table"+date
     table.style.width="800px"
     table.style.borderCollapse="collapse"
     table.style.display="block"
     table.style.textAlign="center" 
     table.style.margin="0 auto"  /* 上下保持为0，左右自动适应 */
     table.style.display="block" /* 确保表格作为块级元素显示 */
     table.style.textAlign="center" /* 表格内的文本居中 */
     
     tbody.style.display="block"
     tbody.style.width="100%"
      if(lightMouse=="no")
     { 
        alert("请先选择编辑器")
        return
     }

      if(jdS("请选择插入位置","enter"))
      {
        return 
      }
     for(var r=0;r<trtd[0];r++)
    {   
       var tr=document.createElement("tr")
        tr.id=table.id+"tr"+(r+1)
        tr.style.width="100%"
        tr.style.display="inline-block"
       for(var c=0;c<trtd[1];c++)
       {
          var td=document.createElement("td")
          td.className=table.id+"td"+(c+1)
          td.style.wordBreak='break-word'
          td.class="tb"
          td.style.wordWrap="break-word"
          td.style.wordBreak="break-all"
          td.style.whiteSpace="normal"
          td.style.minWidth="50px"
          td.style.height="30px"

          //必须使用block和float否则导致不能张贴内容,这里是以前的
          // td.style.display="block"
          // td.style.float="left"
          td.style.width=parseInt(parseInt(table.style.width.replace("px",""))/trtd[1])+"px"
          td.style.border="1px dashed #ccc"
          //由于是作为文本插入的所以要使用这个方法
          td.setAttribute("onclick","showHW()")
          tr.appendChild(td)
       }
       tbody.appendChild(tr)
       table.appendChild(tbody)
    }
    //由于规定编辑框中要为p的独立块，其中在记录函数中
    // 有这项检查，所以这里必须包装为p
    p.appendChild(table)
    lightMouse.insertNode(lightMouse.createContextualFragment(p.innerHTML))
    text.appendChild(document.createElement("br"))
    tableSetBox.style.display="none"
    tableB.style.color="black"
    tdclick()
    paseText()
    undoAandRundo()
 }
   
}



//删除列
function deleC()
{
   var delC=document.getElementById("delC")
   var showRC=document.getElementById("showTable")
   var select=document.getSelection()

   delC.ontouchend=function(event)
   {
    event.preventDefault()
        var data=getdata()
     if(data[Object.keys(data)[0]].length==0)
     {
       alert("没有选中单元格")
       return
     }
       var table=document.getElementById(Object.keys(data)[0]).parentNode
     if(table.tagName=="TBODY")
     {
      table=table.parentNode
     }
        var tr=document.getElementById(Object.keys(data)[0])
        if(tr.children.length==1)
        {
         alert("最后一列了，不能删除")
         return
        }
     var deleList=[]
     for(var key in data)
        {
         var deleElementList= document.getElementsByClassName(data[key])

          for(var i=0;i<deleElementList.length;i++ )
          {
            deleElementList[i].parentNode.removeChild(deleElementList[i])
            i-=1
          }
          var ns=showRC.innerText.split("x")
          showRC.innerText= ns[0]+"x"+(parseInt(ns[1])-1)
       }
  setIdClass(table)
  // data=getdata()
  select.removeAllRanges();
     var tdL=tr.getElementsByTagName("td").length
     var showTable=document.getElementById("showTable")
     showTable.innerText=showTable.innerText.split("x")[0]+"x" +parseInt(tdL)
  undoAandRundo()
   }
}


//删除行
function  deleR()
{
   var editR=document.getElementById("delR")
   var showRC=document.getElementById("showTable")
   editR.ontouchend=function(event)
   {
    event.preventDefault()
      var data=getdata()
     if(data[Object.keys(data)[0]].length==0)
     {
      alert("没有选中单元格")
      return
     }

      var table=document.getElementById(Object.keys(data)[0]).parentNode
      if(table.tagName=="TBODY")
      {
       table=table.parentNode
      }
       var tr=table.getElementsByTagName("tr")
    if(tr.length==1)
    {
     alert("最后一行了，不能删除")
     return
    }

      for(var key in data)
      {
         var deleElementList=document.getElementById(key)
         deleElementList.parentNode.removeChild(deleElementList)

      }
       var ns=showRC.innerText.split("x")
       showRC.innerText= (parseInt(ns[0])-1)+"x"+ns[1]
      setIdClass(table)
      var trL=tr.length
      var showTable=document.getElementById("showTable")
      showTable.innerText=parseInt(trL)+"x"+showTable.innerText.split("x")[1]
  undoAandRundo()
   }

}



//添加列
function  addC()
{
    var addC=document.getElementById("addC")
    var showRC=document.getElementById("showTable")
    var divContainer=document.createElement("div")
    
    var text=document.getElementById("text")
    
   addC.ontouchend=function(event)
   {  
    event.preventDefault()
      var data=getdata()
      var length=0
      if(data[Object.keys(data)[0]].length==0)
     {
      alert("没有选中单元格")
      return
     }
      var getTr=document.getElementById(Object.keys(data)[0])
      var hang=getTr.getElementsByTagName("td")
      for(var w=0;w<hang.length;w++)
      {
       length+=hang[w].offsetWidth
      }
      length+=document.getElementsByClassName(data[Object.keys(data)[0]])[0].offsetWidth
      if(length+60>text.offsetWidth)
      {
       alert("由于编辑框宽度限制，不能再添加列")
       return
      }

      var table=getTr.parentNode
      if(table.tagName=="TBODY")
      {
       table=table.parentNode
      }
      for(var key in data)
      {
         var cell=document.getElementsByClassName(data[key])
         var clen=cell.length
         var attri=cell[0].attributes
         
         for(var j=0;j<clen;j++)
         {
          var attri=cell[j].attributes
            var newCell=document.createElement("td")
            for(var i=0;i<attri.length;i++)
            {
               newCell.setAttribute(attri[i].name,attri[i].value)
            }
            newCell.setAttribute("class","newtd")
            newCell.ontouchend=showHW
            cell[j].parentNode.insertBefore(newCell,cell[j].nextSibling) 
         }
      }
   
    var ns=showRC.innerText.split("x")
    showRC.innerText= ns[0]+"x"+ (parseInt(ns[1])+1)

    setIdClass(table)

    var tdL=getTr.getElementsByTagName("td").length
    var showTable=document.getElementById("showTable")
    showTable.innerText=showTable.innerText.split("x")[0]+"x" +parseInt(tdL)
    undoAandRundo()
   }
}


//添加行
function addR()
{
   var addR=document.getElementById("addR")
   var showRC=document.getElementById("showTable")
   addR.ontouchend=function(event)
   {
     event.preventDefault()
      var data=getdata()
      if(data[Object.keys(data)[0]].length==0)
     {
      alert("没有选中单元格")
      return
     }
      var table=document.getElementById(Object.keys(data)[0]).parentNode
      if(table.tagName=="TBODY")
      {
       table=table.parentNode
      }
      for(var key in data)
      {
         var tr=document.getElementById(key)
         var newTr=document.createElement("tr")
         var child=tr.childNodes
         var trAtir=tr.attributes
         var trAtirLen=trAtir.length
         for(var j=0;j<trAtirLen;j++)
         {
            newTr.setAttribute(trAtir[j].name,trAtir[j].value)
         }
         newTr.id="newTr"
        
         for(var i=0;i<child.length;i++)
         {
            var newTd=document.createElement("td")
            var tdAtir=child[i].attributes
            var tdAtirLen=tdAtir.length

            for(var k=0;k<tdAtirLen;k++)
            {
               newTd.setAttribute(tdAtir[k].name,tdAtir[k].value)
            }
            // newTd.style.height="30px"
            newTd.ontouchend=showHW
            newTd.className="newTd"
            newTr.appendChild(newTd)
         }
         var ns=showRC.innerText.split("x")
       showRC.innerText=(parseInt(ns[0])+1) +"x"+ ns[1]

      }
      
     tr.parentNode.insertBefore(newTr,tr.nextSibling)
     // data=getdata()
     setIdClass(table)
     var trL=table.getElementsByTagName("tr").length
     var showTable=document.getElementById("showTable")
     showTable.innerText=parseInt(trL)+"x"+showTable.innerText.split("x")[1]
     undoAandRundo()
   }
}


dX=0
uX=0
getDX=0
function judgmentDirection()
{
   document.addEventListener('mousedown', function(event) {
    getDX= event.clientX
   });

   document.addEventListener('mouseup', function(event) {
    if(getDX!=event.clientX)
    {  
       dX=getDX
       uX= event.clientX
    }
   });
}
judgmentDirection()

function  getdata(){
 var select=document.getSelection()
 var rang=""
 var pr={}
 var id=""
 var cls=""
 for(var i=0;i<select.rangeCount;i++)
 {
  rang=select.getRangeAt(i)
     if(rang.startOffset==rang.endOffset)
     {
       if(rang.startContainer instanceof Text)
       {
         id=rang.startContainer
          while((id.id==undefined||id.id.replace(/\s+/ig,"").length==0)&&id!=text&&id.tagName!="TR")
          {
            id=id.parentNode
          }

          cls=rang.startContainer
          while((cls.className==undefined||cls.className.replace(/\s+/ig,"").length==0)&&cls!=text&&cls.tagName!="TD")
          {
                cls=cls.parentNode
          }
         pr[id.id]=cls.className
       }
       else if(rang.startContainer.tagName=="TR")
       {
        pr[rang.startContainer.id]=rang.startContainer.childNodes[0].className
       }
       else
       { pr[rang.startContainer.parentNode.id]=rang.startContainer.className
       }
      }
  else if(rang.commonAncestorContainer.tagName=="TR" && rang.startOffset!=rang.endOffset)
  {
       if((uX-dX)>0)
       {
          pr[rang.startContainer.parentNode.parentNode.id]=rang.startContainer.parentNode.className
       }
       else
       {
         pr[rang.endContainer.parentNode.parentNode.id]=rang.endContainer.parentNode.className
       }
  }
  else
  {
      if(rang.startContainer instanceof Text && rang.startContainer==rang.endContainer)
         {
             pr[rang.startContainer.parentNode.parentNode.id]=rang.startContainer.parentNode.className
         }
          else if(rang.startContainer.tagName!="P")
         {
             alert("删除或添加行列只能选一格")
         }
         else
         {

         }
   }
 }
 return pr
}
    
//重新设置id和class
function  setIdClass(table)
{
   var tr=table.getElementsByTagName("tr")
   var tb=table
   var del=tb.getElementsByTagName("td")
   //删除空的表格 
  if(del.length==0)
   {
        tb.parentNode.removeChild(tb)
        return
        }
   if(tb.tagName="TBODY")
   {
    tb=tb.parentNode
   }
   for(var i=0;i<tr.length;i++)
   {
  var td=tr[i].getElementsByTagName("td")
  for(var j=0;j<td.length;j++)
  {
   td[j].setAttribute("class",table.id+"td"+(j+1))
  }
  tr[i].setAttribute("id",table.id+"tr"+(i+1))
 }
}
//设定加行数
function  setAddR()
{
   var setR=document.getElementById("setR")
   var addR=document.getElementsByClassName("insert")[0]
   addR.ontouchend=function(event)
   { 
      event.preventDefault()
      setR.innerText=parseInt(setR.innerText)+1
   }
}

//设定减行数
function  setdelR()
{
 var setR=document.getElementById("setR")
   var addR=document.getElementsByClassName("insert")[2]
   addR.ontouchend=function(event)
   { 
     event.preventDefault()
      if(parseInt(setR.innerText)>1)
      {
       setR.innerText=parseInt(setR.innerText)-1
      }
      else
      {
       alert("最少一行")
      }
      
   }
}


//设定加列数
function  setAddC()
{
   var setC=document.getElementById("setC")
   var addC=document.getElementsByClassName("insert")[1]
   addC.ontouchend=function(event)
   { 
   event.preventDefault()
      setC.innerText=parseInt(setC.innerText)+1
   }
}

//设定减行数
function  setdelC()
{
   var setC=document.getElementById("setC")
   var addC=document.getElementsByClassName("insert")[3]

   addC.ontouchend=function(event)
   { 
    event.preventDefault()
      if(parseInt(setC.innerText)>1)
      {
       setC.innerText=parseInt(setC.innerText)-1
      }
      else
      {
       alert("最少一行")
      }
      undoAandRundo()
   }
}



// 增加宽度
function addCW()
{
 var addCW=document.getElementById("addCW")
    addCW.ontouchend=function(event)
   {
    event.preventDefault()
      var data=getdata()
      var text=document.getElementById("text")
      var shoW=document.getElementById("shoW")
      var td=document.getElementsByClassName(data[Object.keys(data)[0]])
      var tds=document.getElementById(Object.keys(data)[0]).getElementsByTagName("td")
      var length=0
      for(var ts=0;ts<tds.length;ts++)
      {
         length+=tds[ts].offsetWidth
      }

      if(length+63>text.offsetWidth)
      {
       alert("由于编辑框宽度现在，不能再增加宽度")
       return
      }
      var w=parseInt(td[0].style.width.replace("%",""))

      if(w<700)
      {
    for(var i=0;i<td.length;i++)
    {
     td[i].style.width=(w+1)+"px"
     var sp=shoW.innerText.split("x")
     shoW.innerText=td[i].style.width+sp[1]
    }
      }
      undoAandRundo()
   }
}


//减少宽度
function delCW()
{
 var delCW=document.getElementById("delCW")
    delCW.ontouchend=function(event)
   {
     event.preventDefault()
      var data=getdata()
      var shoW=document.getElementById("shoW")
      var td=document.getElementsByClassName(data[Object.keys(data)[0]])
      var w=parseInt(td[0].style.width.replace("%",""))
      if(w>5)
      {
    for(var i=0;i<td.length;i++)
    {
     td[i].style.width=(w-1)+"px"
     var sp=shoW.innerText.split("x")
     shoW.innerText=td[i].style.width+sp[1]
    }
      }
      undoAandRundo()
   }
}


// 增加高度
function addRW()
{
 var addRW=document.getElementById("addRW")
 
    addRW.ontouchend=function(event)
   {
     event.preventDefault()
      var data=getdata()
      var shoW=document.getElementById("shoW")
      
      var tr=document.getElementById(Object.keys(data)[0])
      var td=tr.getElementsByTagName("td")
      var h=parseFloat(td[0].style.height.replace("px","").replace("%","").replace("em",""))
      if(h<100)
      {
    for(var i=0;i<td.length;i++)
    {
     td[i].style.height=(h+1)+"px"
     var sp=shoW.innerText.split("x")
     shoW.innerText=sp[0]+"x"+td[i].style.height.replace("x","")
    
    }
     
  
   
      }
      undoAandRundo()
   }
}


//减少高度
function delRW()
{
 var delRW=document.getElementById("delRW")
 
    delRW.ontouchend=function(event)
   {
     event.preventDefault()
      var data=getdata()
      var shoW=document.getElementById("shoW")
      var tr=document.getElementById(Object.keys(data)[0])
      var td=tr.getElementsByTagName("td")

      var h=parseFloat(td[0].style.height.replace("px","").replace("%","").replace("em",""))
      if(h>5)
      {
              for(var i=0;i<td.length;i++)
              {
               td[i].style.height=(h-1)+"px"
     var sp=shoW.innerText.split("x")
     shoW.innerText=sp[0]+"x"+td[i].style.height.replace("x","")
               
               }
     
    
      }
      undoAandRundo()
   }
}
/*以上是插入表格*/





//保存
function saveData()
{ 
 
 
 
 var saveData=document.getElementById("saveData")
 saveData.ontouchend=function(event)
 { 
  

  endTime=Date.now();
  if((endTime-startTime)>11000)
  {
   return 
  }

  event.preventDefault()
  closeIndex("saveData")

  var text=document.getElementById("text")
     var tL=text.innerText.replace(" ","").split("\n")
     var getTitle=""
     var cls=document.getElementById("cls")
     var cL=cls.value.replace(" ","").replace("\n","")
     var text=document.getElementById("text")

     var dataFlag=""
     var content=text.innerHTML
     var oDataFlage=document.getElementById("oDataFlag").value.replace(/\s*/ig,"")
     var mediaList=document.getElementsByClassName("#-media")
     var media=[]
     
     
     if(showCodeFlag==1)
     {
      
      alert("目前为代码模式请先返回")
      return
     }

     for(var x in tL)
     {
   if(tL[x].length!=0)
   {
    getTitle=tL[x]
    break
   }
   else
   {
    getTitle=""
   }
  }

     if(cls.value.length==0)
     {
         alert("请填写分类")
         return;
     }
     if(getTitle.length==0)
     {
         alert("标题为空")
         return;
     }
     if(!isChineseEnglishDigit(getTitle))
        {
         alert("标题必须为中文英文数字()[]-组成")
         return
        }
         if(!isChineseEnglishDigit(cL))
        {
         alert("类别必须为中文英文数字()[]-组成")
         return
        }
     dataFlag=(cL+"#-#"+getTitle).replace(/\s*/ig,"")
      
     for(var i=0;i<mediaList.length;i++)
     {  
         var Ur=mediaList[i].getAttribute("src")
         if(Ur==null)
         {
              Ur=mediaList[i].getAttribute("href")
         }
         // "../.."+解决图片上传所登录的地址不一样的问题
         media.push("../.."+Ur)
     }
     oMedia=media

     // return
     var data={
             "dataFlag":dataFlag,
             "content":content,
             "oDataFlag":oDataFlage,
             "media":media,
             "subEd":document.getElementById("subEd").value,
             "ls=":cL,
             "fc":"saveData"
     }
    
     ajax(data,"dealCenter.php","json",function(e)
     {
         console.log(e)
         if(e=="ok")
         {
             state("保存成功")
             document.getElementById("subEd").value="yes"
             document.getElementById("oDataFlag").value=dataFlag
             document.getElementById("oMedia").value=media
             document.getElementById("contents").value=content
             setTimeout(function(){
             state("")
             },3000)
         }
         else if(e=="changeNameOrClass")
         {
             alert("名称和类型都重复")
             document.getElementById("subEd").value="no"
         }
         else
         {
             alert("保存失败")
          state("保存失败")
         }
     })
 }
}


//编辑加载
function  loadText()
{ 
 var url=location.href
 var getCls=""
 var text=document.getElementById("text")
 var content=document.getElementById("contents")
 if(url.includes("?")&&url.includes("&"))
 {
  getCls=url.split("?")[1].split("&")
 }
 else if(url.includes("?")&&!url.includes("&"))
 {
    getCls=url.split("?")
 }
 else
 {
  return
 }
 
 var cls=document.getElementById("cls")
 for(var i=0;i<getCls.length;i++)
 {
  if(getCls[i].includes("cls="))
  {
   cls.value=decodeURIComponent(getCls[i].split("cls=")[1].replace(" ","").replace("\n",""))
  }
 }
 text.innerHTML=content.value
 undoAandRundo()
 paseText()
 tdclick()
}

//获取字体表
function setFont()
{
    var fontFamily=document.getElementById("fontFamily")
 var fonts=["仿宋_gb2312","楷体_gb2312","方正小标宋","新魏体","武林江湖体","宋体_粗","微软雅黑_细","微软雅黑","微软雅黑_粗","沧浪行楷","清平手书","飞天手书"]
 var showF=document.getElementById("showF")
 var x=0
 var y=0
 showF.innerHTML="<div id='fontFMove'>设置字体</div>"

 for(var i=0;i<fonts.length;i++)
 {  
        var f=fonts[i].replace(/\s/ig,"#")
  showF.innerHTML+="<button ontouchend=changF('"+f+"') ontouchstart=getPostion()  style='font-family:"+f+"';>"+f+"</button>"
 }

    fontFamily.ontouchend=function(event){
     event.preventDefault()
  if(showCodeFlag==1)
   {
      alert("目前为代码模式请先返回")
      return
   }
  closeIndex("showF")
  var  showF=document.getElementById("showF")
  if(showF.style.display=="none")
  {
   showF.style.display="block"
    showF.style.left=0+"px";
   showF.style.top=40+"px"
   fontFamily.style.color="blue"
  }
  else
  {
   showF.style.display="none"
   fontFamily.style.color="black"
  }

  }
}

 function getPostion()
 {
  
   x=this.event.touches[0].clientX
   y=this.event.touches[0].clientY

 }
 //选择字体
 function changF(font)
 {
  var tch=this.event.changedTouches[0]
  if(x==tch.clientX && y==tch.clientY)
  {
   if(jdS("请框选文字"))
   {
    return
   }
         $().selsectObj({"style":"fontFamily:"+font.replace(/#+/ig," ")})
  }
 }

//点击关闭其它按钮框
function closeIndex(falg)
{
     var cp=["showF","showFontSize","bColor","fColor","H","tableSetBox","showFile"]
     for(var i=0;i<cp.length;i++)
     {  
          if(falg!=cp[i])
          {
           var ele=document.getElementById(cp[i])
          ele.style.display="none"
          }
     }
    var fontFamily=document.getElementById("fontFamily")
    var tt=document.getElementById("tt")
    var HIco=document.getElementById("HIco")
    var tableB=document.getElementById("tableB")
    fontFamily.style.color="black"
    tt.style.color="black"
    HIco.style.color="black"
    tableB.style.color="black"
}

//保存快捷键
document.addEventListener('keydown', function(e) 
{

    var saveData=document.getElementById("saveData")
    if (e.keyCode == 83 && (navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey))
    {
        e.preventDefault()
         if(showCodeFlag==1)
       {
          
          alert("目前为代码模式请先返回")
          return
       }
            saveData.click()
    }
});

//给表格添加点击
function addClick()
{
 var td=document.getElementsByTagName("td")
 for(var i=0;i<td.length;i++)
 {
    td.ontouchend=showHW
 }
}


//移动东西

function move(e,obel)
{   
 var x=0
 var y=0
 var gx=0
 var gy=0
 var li=["tableSetBox","fColor","bColor","showFontSize","fontFMove","H","showFile"]
 var cli=["setR","setC"]
 for(var i=0;i<li.length;i++)
 {
  //必须使用一个函数进行包装否则li[i]
  //首先没有赋值，点击后才赋值，这时i
  //已经变动
  pack(li[i])
 }
 for(var i=0;i<cli.length;i++)
 {
  //阻止子元素的行为
  stopP(document.getElementById(cli[i]))
 }
    //阻止子元素的行为
 function stopP(el)
    {
   el.ontouchmove=function(e)
   {
    e.stopPropagation()
   }
    }

    //移动行数
 function  toMove(e,obel)
 {  
  
 
    var lf=obel.style.left.replace("px","").replace("%","")
     var tp=obel.style.top.replace("px","").replace("%","")

     if(tp==null||tp==undefined||tp.length==0)
     {
      tp=0
     }
     if(lf==null||lf==undefined||lf.length==0)
     {
      lf=0
     }
     //当滚动第一步时clientX-x这时是1，
     //当滚动第二步时不能只是clientX-x这时得到2，
     // 由于前面有了1，这里的2中有原来的1。如果直接加减
     // 导致数值累计。所以从第二步开始是现在的位置减去
     // 前面的位置，同时不能再减去最开始的方块所在位置了。
  obel.style.left=parseInt(lf)+(e.touches[0].clientX-gx-x)+"px"
  obel.style.top=parseInt(tp)+(e.touches[0].clientY-gy-y)+"px"
        gx=e.touches[0].clientX
        gy=e.touches[0].clientY
        x=0
        y=0
   
 }
 //阻止默认新闻
 function yesOrNoStop(e)
 { 
  e.preventDefault()
 }
 //包装函数，解决i变动问题
 function pack(ob)
 {
  
 // alert(ob)
  
  var el=document.getElementById(ob)

     el.ontouchstart=function(e)
  {   
   
   x=e.touches[0].clientX
   y=e.touches[0].clientY
   
   
   
   el.addEventListener('touchmove',yesOrNoStop, {passive: false });
   // el.getElementsByTagName("button")[0].removeEventListener('touchmove',yesOrNoStop,{passiv}}:false})
   if(ob=="fontFMove")
   {
      el.ontouchmove=(e)=>toMove(e,el.parentNode) 
   }
   else{
   
   el.ontouchmove=(e)=>toMove(e,el)
   }
   
 
   
  }
  document.ontouchend=function(e)
  {
   x=0
   y=0
   gx=0
   gy=0
   document.removeEventListener('touchmove',yesOrNoStop,{passive: true });
   el.ontouchmove=null
  }
 }
}
 

//判断选择
function jdS(string="",flag="select")
{    
 var seletion=document.getSelection()
 
   //防止没有先选位置的插入
      if(seletion.anchorNode==null && flag=="select")
       {   if(string.length==0)
           {
             alert("请选择插入的位置")
            }
            else
            {
             alert(string)
            }
        
         return true
       }
        else if(seletion.anchorNode==null && flag=="enter" && seletion.anchorOffset==seletion.focusOffset)
        {
         if(string.length==0)
           {
             alert("请选择插入的位置")
            }
            else
            {
             alert(string)
            }
        
         return true

        }

        else
        {
          return false; 
        }
}

function isMobile() 
{
  const regExp = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i;
  return regExp.test(navigator.userAgent);
}

function isChineseEnglishDigit(str) {
    return /^[A-Za-z0-9\u4e00-\u9fa5()\[\]-]+$/.test(str);
}

//阻止华为系统菜单弹出
function  stopEject()
{
 var sT=0
 var eT=0
 var mv=0

 document.getElementById("text").addEventListener('touchstart',jduge,{passive:false})

 function  jduge(e)
 {
  sT=Date.now();
  s(e)
 }
 function s(e)
 {
  b=e
 }

 document.getElementById("text").addEventListener('touchend', function(er)
 {

  eT=Date.now();
  if((eT-sT)<90)
  {
   try{
    if(touchC==0)
    {  
     // alert(touchC)
     // 这里通过插入片段并选择去除系统菜单
     // 获取当前选区

     var ty = document.getSelection();
     var range = ty.getRangeAt(0);
     // 使用选区创建一个上下文碎片
     var  fr=document.createDocumentFragment(""); //创建文档碎片

     range.insertNode(fr)
     ty.removeAllRanges();
     ty.addRange(range);
     touchC+=1
     er.preventDefault()
     return   false
    }
    else  if(touchC==1)
    {
     var selection = document.getSelection();
     selection.removeAllRanges();
     touchC=0
     return   true
    }
   }
   catch(er)
   {
    console.log(er)
   }
  }
 }) 
}

// 滚动到指定位置
function scroll()
{
 var topBar=document.getElementById("topBar")
 var iconBox=document.getElementById("iconBox")
 setTimeout(function(){
  window.scrollTo(0,topBar.offsetHeight+iconBox.offsetHeight); 
  },500)

 
}
//获取点击开始时间
function  getStartTime()
{
 document.addEventListener('touchstart',function(e){
 startTime=Date.now();
 })
 
}


// 解决表格张贴会带格式的问题
function  paseText()
{
   var text=document.getElementById('text')
    text.addEventListener('paste', function(e) 
    {
        
        var td=document.getElementsByTagName("td")
        for(var i=0;i<td.length;i++)
        {
            td[i].addEventListener('paste', function(e) 
            {
                console.log(9)
                e.preventDefault();  // 阻止默认粘贴行为
                var txt = '';
                if (e.clipboardData || window.clipboardData) 
                {
                    txt = (e.clipboardData || window.clipboardData).getData('text/plain');
                }
                if (document.queryCommandSupported('insertText')) 
                {
                    document.execCommand('insertText', false, txt);
                } 
                else 
                {  // 对于不支持 insertText 的浏览器
                    this.value += txt;
                }
            })
        }
   })
}

//解决在编辑框中点击表格的问题
function tdclick()
{
    var td=document.getElementsByTagName("td")
    for(var i=0;i<td.length;i++)
    {
        (td[i].onclick=showHW)(i)
    }
}